#define  _CRT_SECURE_NO_WARNINGS 1
//#include"head.h"

// 1E10 -> 1.0*10^10

//int main()
//{
//	int n = 9;
//	//00000000 00000000 00000000 00001001
//	float* pf = (float*)&n;
//	//S   E        M
//	//0 00000000 00000000000000000001001
//	//S=0  E=-126  M=0.00000000000000000001001
//	//(-1)^0 * 0.00000000000000000001001 * 2^(-126)
//	printf("n的值为：%d\n", n);//9
//	printf("*pf的值为：%f\n", *pf);//0.000000
//
//	*pf = 9.0;
//	//9.0 --> 二进制：1001.0
//	//                (-1)^0 * 1.001 * 2^3
//	//                S=0  E=3  M=1.001  E+127=130
//	//                0 10000010 00100000000000000000000
//	//                0100 0001 0001 0000 0000 0000 0000 0000
//
//	printf("n的值为：%d\n", n);//1091567616
//	printf("*pf的值为：%f\n", *pf);//9.000000
//
//	//浮点数的存储方式和整型是有区别的
//	return 0;
//}


/*
浮点数的存储
上面的代码中，n和*pf 在内存中明明是同一个数，为什么浮点数和整数的解读结果会差别这么大?
要理解这个结果，一定要搞懂浮点数在计算机内部的表示方法。
根据国际标准IEEE(电气和电子工程协会)754，
任意一个二进制浮点数V可以表示成下面的形式:
V = (-1)^S * M * 2^E
(-1)^S表示符号位，当S=0，V为正数; 当S=1，V为负数
M 表示有效数字，M是大于等于1，小于2的
2^E 表示指数位

float: S - 1bit   E - 8bit   M - 23bit
double: S - 1bit   E - 11bit   M - 52bit

浮点数存的过程：
IEEE 754 对有效数字M和指数E，还有一些特别规定。
前面说过，1≤M<2，也就是说，M可以写成1.xxxxxx的形式，其中 xxxxxx 表示小数部分。
IEEE 754 规定，在计算机内部保存M时，默认这个数的第一位总是1，因此可以被舍去，只保存后面的xxxxxx部分。
比如保存1.01的时候，只保存01，等到读取的时候，再把第一位的1加上去。
这样做的目的，是节省1位有效数字。
以32位浮点数为例，留给M只有23位，将第一位的1舍去以后，等于可以保存24位有效数字

至于指数E，情况就比较复杂
首先，E为一个无符号整数(unsignedint)
这意味着，如果E为8位，它的取值范围为0~255;如果E为11位，它的取值范围为0~2047。
但是，我们知道，科学计数法中的E是可以出现负数的，所以IEEE754规定，存入内存时E的真实值必须再加上一个中间数，
对于8位的E这个中间数是127; --> （没必要很大，用不到，当它很大时几乎趋近于0）
对于11位的E，这个中间数是1023。
比如，21的E是10，所以保存成32位浮点数时，必须保存成10+127=137，即10001001.
*/

//int main()
//{
//	float f = 5.5f;
//	//2进制：101.1 == 1.011 * 2^2
//	//             == (-1)^0 * 1.011 * 2^2
//	//                S=0   M=1.011   E=2 --> E+127=129
//	//                0   10000001   01100000000000000000000
//	//                S     E            M
//	//                0100 0000 1011 0000 0000 0000 0000 0000
//	//             0x 4    0    B    0    0    0    0    0    
//
//
//	return 0;
//}
